﻿# -*- coding=utf-8 -*-
# 官方网站：http://www.vnpy.cn
from ctypes import *

# 自定义字段
class VNInsertOrder(Structure):
    _fields_ = [('InstrumentID', c_char * 81),
                ('ExchangeID', c_char * 9),
                ('Direction', c_char),
                ('OffsetFlag', c_char),
                ('PriceType', c_char),
                ('Price', c_double),
                ('Num', c_int32)
                ]
    pass

# 自定义字段，相对CTP精简部分字段
class VNDEFTradingAccountField(Structure):
    _fields_ = [('BrokerID', c_char * 11),  # 经纪公司代码
                ('InvestorID', c_char * 13),  # 投资者代码
                ('TradingDay', c_char * 9),
                ('Prebalance', c_double),  # 静态权益
                ('Current', c_double),  # 动态权益
                ('Available', c_double),  # 可用权益
                ('Rate', c_double),  # 今日盈亏
                ('Positionrate', c_double),  # 仓位，风险度
                ('WithdrawQuota', c_double),  # 可取资金
                ('Commission', c_double)  # 手续费
                ]
    pass

# 原生CTP结构体字段
class VNDEFInvestorPosition(Structure):
    _fields_ = [
        ('reserve1', c_char * 31),  # 保留字段
        ('BrokerID', c_char * 11),  # 经纪公司代码
        ('InvestorID', c_char * 13),  # 投资者代码
        ('PosiDirection', c_char),  # 持仓多空方向
        ('HedgeFlag', c_char),  # 投机套保标志
        ('PositionDate', c_char),  # 持仓日期
        ('YdPosition', c_int32),  # 上日持仓
        ('Position', c_int32) ,   # 今日持仓
        ('LongFrozen', c_int32),   # 多头冻结
        ('ShortFrozen', c_int32),  # 空头冻结
        ('LongFrozenAmount', c_double),  # 开仓冻结金额
        ('ShortFrozenAmount', c_double),  # 开仓冻结金额
        ('OpenVolume', c_int32),   # 开仓量
        ('CloseVolume', c_int32),  # 平仓量
        ('OpenAmount', c_double),  # 开仓金额
        ('CloseAmount', c_double),  # 平仓金额
        ('PositionCost', c_double),  # 持仓成本
        ('PreMargin', c_double),  # 上次占用的保证金
        ('UseMargin', c_double),  # 占用的保证金
        ('FrozenMargin', c_double),  # 冻结的保证金
        ('FrozenCash', c_double),  # 冻结的资金
        ('FrozenCommission', c_double),  # 冻结的手续费
        ('CashIn', c_double),  # 资金差额
        ('Commission', c_double),  # 手续费
        ('CloseProfit', c_double),  # 平仓盈亏
        ('PositionProfit', c_double),  # 持仓盈亏
        ('PreSettlementPrice', c_double),  # 上次结算价
        ('SettlementPrice', c_double),  # 本次结算价
        ('TradingDay', c_char * 9),  # 本次结算价
        ('SettlementID',c_int32),  # 结算编号
        ('OpenCost', c_double),  # 开仓成本
        ('ExchangeMargin', c_double),  # 交易所保证金
        ('CombPosition', c_int32),  # 组合成交形成的持仓
        ('CombLongFrozen', c_int32),  # 组合多头冻结
        ('CombShortFrozen', c_int32),  # 组合空头冻结
        ('CloseProfitByDate', c_double),  # 逐日盯市平仓盈亏
        ('CloseProfitByTrade', c_double),  # 逐笔对冲平仓盈亏
        ('TodayPosition', c_int32),  # 今日持仓
        ('MarginRateByMoney', c_double),  # 保证金率
        ('MarginRateByVolume', c_double),  # 保证金率(按手数)
        ('StrikeFrozen', c_int32),  # 执行冻结
        ('StrikeFrozenAmount', c_double),  # 执行冻结金额
        ('AbandonFrozen', c_int32),  # 放弃执行冻结
        ('ExchangeID',  c_char * 9),  # 交易所代码
        ('YdStrikeFrozen', c_int32),  # 执行冻结的昨仓
        ('InvestUnitID', c_char * 17),  # 投资单元代码
        ('PositionCostOffset', c_double),  # 大商所持仓成本差值，只有大商所使用
        ('TasPosition', c_int32),  # tas持仓手数
        ('TasPositionCost', c_double) , # tas持仓成本
        ('InstrumentID', c_char * 81),  # 合约代码

    ]
    pass

'''
class VNDEFTradingAccountField2222(Structure):
    _fields_ = [('BrokerID', c_char * 11),  # 经纪公司代码
                ('InvestorID', c_char * 13),  # 投资者代码
                ('Prebalance', c_double),  # 静态权益
                ('Current', c_double),  # 动态权益
                ('Available', c_double),  # 可用权益
                ('Rate', c_double),  # 今日盈亏
                ('Positionrate', c_double),  # 仓位
                ('WithdrawQuota', c_double),  # 可取资金
                ('Commission', c_double),  # 手续费
                ('TradingDay', c_char * 9)   # 交易日
                ]
    pass
'''
# 原生CTP结构体字段
class VNCThostFtdcOrderField(Structure):
    _fields_ = [('BrokerID', c_char * 11),  # 经纪公司代码
                ('InvestorID', c_char * 13),  # 投资者代码
                ('reserve1', c_char * 31),  # 合约代码
                ('OrderRef', c_char * 13),  # 报单引用
                ('UserID', c_char * 16),  # 用户代码
                ('OrderPriceType', c_char * 1),  # 报单价格条件
                ('Direction', c_char * 1),  # 买卖方向
                ('CombOffsetFlag', c_char * 5),  # 组合开平标志
                ('CombHedgeFlag', c_char * 5),  # 组合投机套保标志
                ('LimitPrice', c_double),  # 价格
                ('VolumeTotalOriginal', c_int),  # 数量
                ('TimeCondition', c_char * 1),  # 有效期类型
                ('GTDDate', c_char * 9),  # GTD日期
                ('VolumeCondition', c_char * 1),  # 成交量类型
                ('MinVolume', c_int),  # 最小成交量
                ('ContingentCondition', c_char * 1),  # 触发条件
                ('StopPrice', c_double),  # 止损价
                ('ForceCloseReason', c_char * 1),  # 强平原因
                ('IsAutoSuspend', c_int),  # 自动挂起标志
                ('BusinessUnit', c_char * 21),  # 业务单元
                ('RequestID', c_int),  # 请求编号
                ('OrderLocalID', c_char * 13),  # 本地报单编号
                ('ExchangeID', c_char * 9),  # 交易所代码
                ('ParticipantID', c_char * 11),  # 会员代码
                ('ClientID', c_char * 11),  # 客户代码
                ('reserve2', c_char * 31),  # 合约在交易所的代码
                ('TraderID', c_char * 21),  # 交易所交易员代码
                ('InstallID', c_int32),  # 安装编号
                ('OrderSubmitStatus', c_char * 1),  # 报单提交状态
                ('NotifySequence', c_int32),  # 报单提示序号
                ('TradingDay', c_char * 9),  # 交易日
                ('SettlementID', c_int32),  # 结算编号
                ('OrderSysID', c_char * 21),  # 报单编号
                ('OrderSource', c_char * 1),  # 报单来源
                ('OrderStatus', c_char * 1),  # 报单状态
                ('OrderType', c_char * 1),  # 报单类型
                ('VolumeTraded', c_int32),  # 今成交数量
                ('VolumeTotal', c_int32),  # 剩余数量
                ('InsertDate', c_char * 9),  # 报单日期
                ('InsertTime', c_char * 9),  # 委托时间
                ('ActiveTime', c_char * 9),  # 激活时间
                ('SuspendTime', c_char * 9),  # 挂起时间
                ('UpdateTime', c_char * 9),  # 最后修改时间
                ('CancelTime', c_char * 9),  # 撤销时间
                ('ActiveTraderID', c_char * 21),  # 最后修改交易所交易员代码
                ('ClearingPartID', c_char * 11),  # 结算会员编号
                ('SequenceNo', c_int32),  # 序号
                ('FrontID', c_int32),  # 前置编号
                ('SessionID', c_int32),  # 会话编号
                ('UserProductInfo', c_char * 11),  # 用户端产品信息
                ('StatusMsg', c_char * 81),  # 状态信息
                ('UserForceClose', c_int32),  # 用户强评标志
                ('ActiveUserID', c_char * 16),  # 操作用户代码
                ('BrokerOrderSeq', c_int32),  # 经纪公司报单编号
                ('RelativeOrderSysID', c_char * 21),  # 相关报单
                ('ZCETotalTradedVolume', c_int32),  # 郑商所成交数量
                ('IsSwapOrder', c_int32),  # 互换单标志
                ('BranchID', c_char * 9),  # 营业部编号
                ('InvestUnitID', c_char * 17),  # 投资单元代码
                ('AccountID', c_char * 13),  # 资金账号
                ('CurrencyID', c_char * 4),  # 币种代码
                ('reserve3', c_char * 16),  # IP地址
                ('MacAddress', c_char * 21),  # Mac地址
                ('InstrumentID', c_char * 81),  # 合约代码
                ('ExchangeInstID', c_char * 81),  # 合约在交易所的代码
                ('IPAddress', c_char * 33),  # IP地址
                ]
    pass

# 原生CTP结构体字段
class VNCThostFtdcTraderField(Structure):
    _fields_ = [('BrokerID', c_char * 11),  # 经纪公司代码
                ('InvestorID', c_char * 13),  # 投资者代码
                ('reserve1', c_char * 31),  # 合约代码
                ('OrderRef', c_char * 13),  # 报单引用
                ('UserID', c_char * 16),  # 用户代码
                ('ExchangeID', c_char * 9),  # 交易所代码
                ('TradeID', c_char * 21),  # 成交编号
                ('Direction', c_char),  # 买卖方向
                ('OrderSysID', c_char * 21),  # 报单编号
                ('ParticipantID', c_char * 11),  # 会员代码
                ('ClientID', c_char * 11),  # 客户代码
                ('TradingRole', c_char),  # 交易角色
                ('reserve2', c_char * 31),  # 合约在交易所的代码
                ('OffsetFlag', c_char),  # 开平标志
                ('HedgeFlag', c_char),  # 投机套保标志
                ('Price', c_double),  # 价格
                ('Volume', c_int),  # 数量
                ('TradeDate', c_char * 9),  # 成交时期
                ('TradeTime', c_char * 9),  # 成交时间
                ('TradeType', c_char),  # 成交类型
                ('PriceSource', c_char),  # 成交价来源
                ('TraderID', c_char * 21),  # 交易所交易员代码
                ('OrderLocalID', c_char * 13),  # 本地报单编号
                ('ClearingPartID', c_char * 11),  # 结算会员编号
                ('BusinessUnit', c_char * 21),  # 业务单元
                ('SequenceNo', c_int),  # 序号
                ('TradingDay', c_char * 9),  # 交易日
                ('SettlementID', c_int),  # 结算编号
                ('BrokerOrderSeq', c_int),  # 经纪公司报单编号
                ('TradeSource', c_char),  # 成交来源
                ('InvestUnitID', c_char*17),  # 投资单元代码
                ('InstrumentID', c_char * 81),  # 合约代码
                ('ExchangeInstID', c_char * 81)  # 合约在交易所的代码
                ]
    pass

# 原生CTP结构体字段，暂时未用到
class VNCThostFtdcSettlementInfoConfirmField222(Structure):
    _fields_ = [('BrokerID', c_char * 11),  # 经纪公司代码
                ('InvestorID', c_char * 13),  # 投资者代码
                ('ConfirmDate', c_char * 9),  # 确认日期
                ('ConfirmTime', c_char * 9),  # 确认时间
                ('SettlementID', c_int), # 确认时间
                ('AccountID', c_char * 13),  # 确认时间
                ('CurrencyID', c_char * 4)  # 确认时间

                ]
    pass


class VNCThostFtdcQueryMaxOrderVolumeField(Structure):
    _fields_ = [('BrokerID', c_char * 11),  # 经纪公司代码
                ('InvestorID', c_char * 13),  # 投资者代码
                #('InstrumentID', c_char * 81),  # 合约代码
                ('reserve1', c_char * 31),  # 合约代码
                ('Direction', c_char * 1),  # 买卖方向
                ('OffsetFlag', c_char * 1),  # 开平标志
                ('HedgeFlag', c_char * 1),  # 投机套保标志
                ('MaxVolume', c_int32),  # 最大允许报单数量
                ('ExchangeID', c_char * 9),  # 交易所代码
                ('InvestUnitID', c_char * 17),  # 投资单元代码
                ('InstrumentID', c_char * 81) # 合约代码
                ]
    pass


class VNCThostFtdcRspInfoField(Structure):
    _fields_ = [('ErrorID', c_int32),  # 错误代码
                ('ErrorMsg', c_char * 81)  # 错误信息
                ]
    pass


class VNCThostFtdcRspUserLoginField(Structure):
    _fields_ = [('TradingDay', c_char * 9),  # 交易日
                ('LoginTime', c_char * 9),  # 登录成功时间
                ('BrokerID', c_char * 11),  # 经纪公司代码
                ('UserID', c_char * 16),  # 用户代码
                ('SystemName', c_char * 41),  # 交易系统名称
                ('FrontID', c_int32),  # 前置编号
                ('SessionID', c_int32),  # 会话编号
                ('MaxOrderRef', c_char * 13),  # 最大报单引用
                ('SHFETime', c_char * 9),  # 上期所时间
                ('DCETime', c_char * 9),  # 大商所时间
                ('CZCETime', c_char * 9),  # 郑商所时间
                ('FFEXTime', c_char * 9),  # 中金所时间
                ('INETime', c_char * 9)  # 能源中心时间
                ]
    pass

class VNCThostFtdcUserLogoutField(Structure):
    _fields_ = [
                ('BrokerID', c_char * 11),  # 经纪公司代码
                ('UserID', c_char * 16)  # 用户代码
                ]
    pass


VN_Long = 0  # 买
VN_Short = 1  # 卖

# Direction or bsflag
VN_D_Buy = ('0')  # 买
VN_D_Sell = ('1')  # 卖

# offsetFlag
VN_OF_Open = ('0')  # 开仓
VN_OF_Close = c_wchar('1')  # 平仓
VN_OF_ForceClose = c_wchar('2')  # 强平
VN_OF_CloseToday = c_wchar('3')  # 平今
VN_OF_CloseYesterday = c_wchar('4')  # 平昨
VN_OF_ForceOff = c_wchar('5')  # 强减
VN_OF_LocalForceClose = c_wchar('6')  # 本地强平

# price type
VN_OPT_AnyPrice = '1'  # 任意价
VN_OPT_LimitPrice = '2'  # 限价
VN_OPT_BestPrice = '3'  # 最优价
VN_OPT_LastPrice = '4'  # 最新价
VN_OPT_LastPricePlusOneTicks = '5'  # 最新价浮动上浮1个ticks
VN_OPT_LastPricePlusTwoTicks = '6'  # 最新价浮动上浮2个ticks
VN_OPT_LastPricePlusThreeTicks = '7'  # 最新价浮动上浮3个ticks
VN_OPT_AskPrice1 = '8'  # 卖一价
VN_OPT_AskPrice1PlusOneTicks = '9'  # 卖一价浮动上浮1个ticks
VN_OPT_AskPrice1PlusTwoTicks = 'A'  # 卖一价浮动上浮2个ticks
VN_OPT_AskPrice1PlusThreeTicks = 'B'  # 卖一价浮动上浮3个ticks
VN_OPT_BidPrice1 = 'C'  # 买一价
VN_OPT_BidPrice1PlusOneTicks = 'D'  # 买一价浮动上浮1个ticks
VN_OPT_BidPrice1PlusTwoTicks = 'E'  # 买一价浮动上浮2个ticks
VN_OPT_BidPrice1PlusThreeTicks = 'F'  # 买一价浮动上浮3个ticks

VN_Dynamic = 1  # 动态止损
VN_Static = 2  # 静态止损

VN_Dynamic_Capital = 0  # 动态止损
VN_Static_Capital = 1  # 静态止损

VN_POSITION_Sell_Today = 9001  # 今日空单
VN_POSITION_Buy_Today = 9002  # 今日多单
VN_POSITION_Sell_History = 9003  # 非今日空单
VN_POSITION_Buy_History = 9004  # 非今日多单
VN_POSITION_Sell_All = 9005  # 所有空单
VN_POSITION_Buy_All = 9006  # 所有多单
